package com.tecnoagrosoft.zafra.control.activity;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.tecnoagrosoft.zafra.control.activity.R;
import com.tecnoagrosoft.zafra.control.db.GenericManager;
import com.tecnoagrosoft.zafra.control.db.GestorDB;
import com.tecnoagrosoft.zafra.control.utils.UtilsGeneric;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class SeguimientoFormActivity extends Activity {

	private int modo;
	private GestorDB gestorDB;
	private GenericManager gM;
	private Integer idSeguimiento = 0;
	private Integer idParcela;
	private String descripcionSeguimiento;
	private Cursor c;
	private int isVersion;
	private Cursor cursorListaGrano;
	private Cursor cursorListaVariedad;
	private String nombreParcela;
	
	//
	// Elementos de la vista
	//
	private TextView nombre;
	private TextView descripcion;
	private Spinner grano;
	private Spinner variedad;
	private DatePicker fechaSiembra;
	private EditText fertilizante;
	private EditText cantidadSemillaMetroLineal;
	private RadioGroup tipoZafraGrupo;
	private int tipoZafra = 1;

	private Button btnGuardar;
	private Button btnCancelar;

	@SuppressLint("SimpleDateFormat")
	final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
	final SimpleDateFormat dfSiembra = new SimpleDateFormat("yyyy-MM-dd");
	final SimpleDateFormat dfYear = new SimpleDateFormat("yyyy");
	Calendar cal = Calendar.getInstance();
	final Date today = cal.getTime();

	final @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_seguimiento_form);

		Intent intent = getIntent();
		Bundle extra = intent.getExtras();

		if (extra == null)
			return; // si los parametros no son enviados vuelve otra vez
		//
		// Obtenemos los elementos de la vista
		//
		nombre = (TextView) findViewById(R.id.textViewNombreParcelaSeguimiento);
		descripcion = (TextView) findViewById(R.id.textViewDescripcionParcelaSeguimiento);
		grano = (Spinner) findViewById(R.id.spinnerGranoSeguimiento);
		variedad = (Spinner) findViewById(R.id.spinnerVariedadSeguimiento);
		fechaSiembra = (DatePicker) findViewById(R.id.datePickerFechaSiembra);
		fechaSiembra.setCalendarViewShown(false);
		fertilizante = (EditText) findViewById(R.id.editTextAbonoPorKgxHa);
		cantidadSemillaMetroLineal = (EditText) findViewById(R.id.editTextCantidadSemillaLineal);
		tipoZafraGrupo = (RadioGroup) findViewById(R.id.tipozafra);
		tipoZafraGrupo.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				// TODO Auto-generated method stub
				switch (checkedId) {
				case R.id.primera_zafra:
					tipoZafra = 1;
					break;
				case R.id.segunda_zafra:
					tipoZafra = 2;

					break;
				case R.id.tercera_zafra:
					tipoZafra = 3;

					break;
				case R.id.cuarta_zafra:
					tipoZafra = 4;

					break;
				}

			}

		});

		btnGuardar = (Button) findViewById(R.id.btnSave);
		btnCancelar = (Button) findViewById(R.id.btnCancel);

		// abrimos la bases de datos
		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);

		// /////////////////////////////////////////////combo
		// ////////////// grano
		String[] columnsGranos = { "_id", "descripcion" };
		cursorListaGrano = gM.getAllObjects("grano", columnsGranos);
		SimpleCursorAdapter adapterGrano = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursorListaGrano,
				new String[] { "descripcion" }, new int[] { android.R.id.text1 }, 0);

		adapterGrano.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		grano.setAdapter(adapterGrano);
		grano.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			public void onItemSelected(AdapterView<?> parent, android.view.View v, int position, long id) {

				gestorDB = new GestorDB(SeguimientoFormActivity.this);
				SQLiteDatabase db = gestorDB.getWritableDatabase();
				gM = new GenericManager(db);
				String[] columnsVariedad = { "_id", "descripcion" };
				cursorListaVariedad = gM.getObjectWhere("variedad", columnsVariedad, " _id=1 or grano_id= " + grano.getSelectedItemId());
				
				SimpleCursorAdapter adapterVariedad = new SimpleCursorAdapter(SeguimientoFormActivity.this, android.R.layout.simple_spinner_item,
						cursorListaVariedad, new String[] { "descripcion" }, new int[] { android.R.id.text1 }, 0);
				adapterVariedad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
				variedad.setAdapter(adapterVariedad);
				
				gM.close();
				db.close();
				gestorDB.close();
				
				

			}

			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
			}
		});
		// //////////////variedad

		String[] columnsVariedad = { "_id", "descripcion" };

		cursorListaVariedad = gM.getObjectWhere("variedad", columnsVariedad, " _id=1  or grano_id = " + grano.getSelectedItemId());

		

		SimpleCursorAdapter adapterVariedad = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursorListaVariedad,
				new String[] { "descripcion" }, new int[] { android.R.id.text1 }, 0);
		adapterVariedad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		variedad.setAdapter(adapterVariedad);

		// ////////////////////////////////////////
		// /////////////////////////////////////////////fin combo

		if (extra.containsKey("id")) {
			String[] columns = { "_id", "parcela_id", "grano_id", "variedad_id", "fecha_siembra", "descripcion", "fecha_creacion", "abono_por_kg_ha",
					"cantidad_semilla_metro_lineal", "is_version", "tipo_zafra" };

			idSeguimiento = extra.getInt("id");
			c = gM.getObjectById("seguimiento_de_parcela", columns, extra.getInt("id"));
			idParcela = c.getInt(c.getColumnIndex("parcela_id"));
			isVersion = c.getInt(c.getColumnIndex("is_version"));
			loadHeader();
			onLoadRegistro(c);
			c.close();

		}
		establecerModo(extra.getInt("modo"));
		if (extra.containsKey("parcelaId")) {
			idParcela = extra.getInt("parcelaId");

			loadHeader();

		}

		btnGuardar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				if (validadorCampos()) {

					if ((dfYear.format(today)).equals(fechaSiembra.getYear() + "")) {

						save();

					} else {
						Toast.makeText(SeguimientoFormActivity.this, R.string.error_field_verificar_year, Toast.LENGTH_LONG).show();
					}
				}
			}
		});

		btnCancelar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				cancel();

			}

		});

		gM.close();
		db.close();
		gestorDB.close();
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:

			// do your stuff here, eg: finish();
			Intent intentNew = new Intent();
			if (idSeguimiento != 0) {
				intentNew.putExtra("id", idSeguimiento.toString());
			}
			setResult(RESULT_OK, intentNew);// para que al volver no se realize
											// algun cambio
			finish();
			// NavUtils.navigateUpTo(this,intentNew);

			return true;
		}
		return super.onOptionsItemSelected(item);

	}

	

	private void loadHeader() {
		String[] columns = { "_id", "nombre", "descripcion", "dimension", "ubicacion", "altitud", "alquilado", "fecha_creacion" };

		Cursor cursor = gM.getObjectById("parcela", columns, idParcela);
		nombreParcela= cursor.getString(cursor.getColumnIndex("nombre"));
		nombre.setText(getString(R.string.parcela_nombre) + ": " +nombreParcela);
		descripcion.setText(cursor.getString(cursor.getColumnIndex("descripcion")));
	}

	private boolean onLoadRegistro(Cursor cursor) {
		boolean ok = true;

		
		grano.setSelection(getItemPositionById(cursorListaGrano, cursor.getInt(cursor.getColumnIndex("grano_id"))));
		variedad.setSelection(getItemPositionById(cursorListaVariedad, cursor.getInt(cursor.getColumnIndex("variedad_id"))));
		
//		variedad.setSelection(getItemPositionById(cursorListaVariedad,2));

		fertilizante.setText(cursor.getString(cursor.getColumnIndex("abono_por_kg_ha")));
		cantidadSemillaMetroLineal.setText(cursor.getString(cursor.getColumnIndex("cantidad_semilla_metro_lineal")));
		tipoZafra = cursor.getInt(cursor.getColumnIndex("tipo_zafra"));

		Date fechaSiembraDB = null;
		try {

			fechaSiembraDB = dfSiembra.parse(cursor.getString(cursor.getColumnIndex("fecha_siembra")));

		} catch (ParseException e) {
			System.out.println(getString(R.string.falloParseo) + cursor.getString(cursor.getColumnIndex("fecha_siembra")));
		}

		Calendar cal = Calendar.getInstance();
		cal.setTime(fechaSiembraDB);
		// cal.add(Calendar.MONTH, 1);

		int xxday = cal.get(Calendar.DATE);
		int xxmonth = cal.get(Calendar.MONTH);
		int xxyear = cal.get(Calendar.YEAR);

		fechaSiembra.init(xxyear, xxmonth, xxday, null);

		switch (tipoZafra) {
		case 1:
			RadioButton rb1 = (RadioButton) findViewById(R.id.primera_zafra);
			rb1.setChecked(true);
			break;
		case 2:
			RadioButton rb2 = (RadioButton) findViewById(R.id.segunda_zafra);
			rb2.setChecked(true);
			break;
		case 3:
			RadioButton rb3 = (RadioButton) findViewById(R.id.tercera_zafra);
			rb3.setChecked(true);
			break;
		case 4:
			RadioButton rb4 = (RadioButton) findViewById(R.id.cuarta_zafra);
			rb4.setChecked(true);
			break;

		default:
			break;
		}

		return ok;

	}

	private int getItemPositionById(Cursor cg, int id) {
		int posicion = 0;
		for (cg.moveToFirst(); !cg.isAfterLast(); cg.moveToNext()) {
			if (cg.getInt(cg.getColumnIndex("_id")) == id) {
				posicion = cg.getPosition();
			}
		}
	
		return posicion;
	}

	private void establecerModo(int m) {
		this.modo = m;

		if (modo == GestorDB.C_VISUALIZAR) {
			this.setTitle(nombre.getText().toString());
			this.setEdicion(false);
		} else if (modo == GestorDB.C_CREAR) {
			this.setTitle(getString(R.string.men_seguimiento_establecerModo_nuevaSeguimiento));
			this.setEdicion(true);
		} else if (modo == GestorDB.C_EDITAR) {
			this.setTitle(getString(R.string.men_seguimiento_establecerModo_editarSeguimineto) + " " + nombre.getText().toString());
			this.setEdicion(true);
		}
	}

	private void setEdicion(boolean opcion) {
		nombre.setEnabled(opcion);
		descripcion.setEnabled(opcion);

		// Controlamos visibilidad de botonera
		LinearLayout v = (LinearLayout) findViewById(R.id.botoneraSeguimiento);

		if (opcion)
			v.setVisibility(View.VISIBLE);

		else
			v.setVisibility(View.GONE);
	}

	/**
	 * Metodo que inserta o actualiza segun sea la accion
	 */
	private void save() {

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);
		ContentValues reg = new ContentValues();

		String[] columnsU = { "_id", "nombre", "usuario", "activo", "pass", "apellido" };
		// se valida si el usuario relizo la primera sincronizacion
		Cursor cu = gM.getObjectWhere("usuario", columnsU, "activo = 1  and (sincro is null or sincro =0)  ");
		if (cu.moveToFirst()) {
			Toast.makeText(SeguimientoFormActivity.this, R.string.men_no_sincronizado, Toast.LENGTH_SHORT).show();
		} else {

			if (modo == GestorDB.C_EDITAR)
				reg.put("_id", idSeguimiento);

			reg.put("parcela_id", idParcela);
			reg.put("fecha_siembra", fechaSiembra.getYear() + "-" + (fechaSiembra.getMonth() + 1) + "-" + fechaSiembra.getDayOfMonth());
			reg.put("descripcion", this.getDescripcionSeguimientoDB(grano.getSelectedItemId(), variedad.getSelectedItemId(), idParcela));
			reg.put("variedad_id", variedad.getSelectedItemId());
			reg.put("grano_id", grano.getSelectedItemId());
			reg.put("abono_por_kg_ha", fertilizante.getText().toString());
			reg.put("cantidad_semilla_metro_lineal", cantidadSemillaMetroLineal.getText().toString());
			reg.put("tipo_zafra", tipoZafra);
			

			// //////////////////////////////////////////////////////////////////////////////////////////////
			// ////////// Crear mensaje de notificacion
			// //////////////////////////////////////////////////////////////////////////////////////////////
			ContentValues regMes = new ContentValues();
			regMes.put("nombre_tabla", "seguimiento_de_parcela");
			regMes.put("titulo", UtilsGeneric.getTipoZafra(tipoZafra)+" zafra en "+nombreParcela);

			regMes.put("descripcion", getString(R.string.men_seguimiento_save_notificacion_descripcion));
			regMes.put("fecha_ejecucion", fechaSiembra.getYear() + "-" + fechaSiembra.getMonth() + 15 + "-" + fechaSiembra.getDayOfMonth() + "-00-00-00");

			Integer idNewSeguimiento = 0;
			if (modo == GestorDB.C_CREAR) {
				reg.put("fecha_creacion", df.format(today));
				reg.put("activo", Boolean.TRUE);
				reg.put("finalizado", "0");
				reg.put("is_delete", 0);
				reg.put("is_version", 1);

				// se guardar la primera vez
				idNewSeguimiento = Integer.parseInt("" + gM.insertObject("seguimiento_de_parcela", reg));
				Toast.makeText(SeguimientoFormActivity.this, R.string.men_new, Toast.LENGTH_SHORT).show();

				// se crea un nuevo mensaje
				regMes.put("finalizado", "0");
				regMes.put("tabla_id", idNewSeguimiento);
				gM.insertObject("mensaje", regMes);

			} else if (modo == GestorDB.C_EDITAR) {
				reg.put("is_version", isVersion + 1);
				reg.put("is_delete", 0);
				gM.updateObject("seguimiento_de_parcela", reg, idSeguimiento);
				Toast.makeText(SeguimientoFormActivity.this, R.string.men_update, Toast.LENGTH_SHORT).show();

				// buscar y actualiza el mensaje
				String[] columns = { "_id", "descripcion", "tabla_id", "nombre_tabla" };
				Cursor cMensaje = gM.getObjectWhere("mensaje", columns, "nombre_tabla='seguimiento_de_parcela' and tabla_id=" + idSeguimiento);
				if (cMensaje.moveToFirst()) {
					gM.updateObject("mensaje", regMes, cMensaje.getInt(cMensaje.getColumnIndex("_id")));
				}

			}

			// //////////////////////////////////se crea la aplicion
			// if (modo == GestorDB.C_CREAR) {
			//
			// ContentValues regNewA = new ContentValues();
			// regNewA.put("seguimiento_de_parcela_id", idNewSeguimiento);
			// regNewA.put("fecha_aplicacion", df.format(today));
			// regNewA.put("aplicacion_tipo_id", 1);// SIEMBRA
			// regNewA.put("descripcion",
			// "Siembra - FALTA COMPLETAR LOS DATOS");
			// regNewA.put("costo_personal", 0);
			// regNewA.put("costo_insumo", 0);
			// regNewA.put("costo_gasto", 0);
			// regNewA.put("total_general", 0);
			// gM.insertObject("aplicacion", regNewA);
			//
			// }
		}
		gM.close();
		db.close();
		gestorDB.close();

		//
		// Devolvemos el control
		//
		Intent intentNew = new Intent();
		if (idSeguimiento != 0) {
			intentNew.putExtra("id", idSeguimiento.toString());
		}
		setResult(RESULT_OK, intentNew);//
		finish();

	}

	/**
	 * Esta metodo solo sera utilizada para genera la descripcion seguimiento
	 * una vez abierta laconexion de la bases de datos
	 * 
	 * @return
	 */
	public String getDescripcionSeguimientoDB(long granoId, long variedadId, Integer parcelaId) {

		Cursor gr;
		Cursor va;
		Cursor pa;
		String[] columns = { "_id", "descripcion" };
		String[] columnsParcela = { "_id", "nombre" };

		descripcionSeguimiento = "";

		pa = gM.getObjectById("parcela", columnsParcela, parcelaId);
		descripcionSeguimiento += pa.getString(pa.getColumnIndex("nombre")) + ",";

		gr = gM.getObjectById("grano", columns, Integer.parseInt("" + granoId));
		descripcionSeguimiento += gr.getString(gr.getColumnIndex("descripcion")) + ",";

		va = gM.getObjectById("variedad", columns, Integer.parseInt("" + variedadId));
		descripcionSeguimiento += va.getString(gr.getColumnIndex("descripcion")) + ",";

		return descripcionSeguimiento;
	}

	/**
	 * Metodo para cancelar la accion
	 */
	private void cancel() {
		setResult(RESULT_CANCELED, null);
		finish();

	}



	private boolean validadorCampos() {
		// TODO Auto-generated method stub
		View focusView = null;
		// Restablecer errores.
		fertilizante.setError(null);
		cantidadSemillaMetroLineal.setError(null);
		boolean error = false;
		boolean cancel = false;
		
		focusView = UtilsGeneric.validator(fertilizante, 1, 3, SeguimientoFormActivity.this);
		if (focusView != null){
			error = true;
			focusView.requestFocus();
		}		
		focusView = UtilsGeneric.validator(cantidadSemillaMetroLineal, 2, 2, SeguimientoFormActivity.this);
		if (focusView != null){
			error = true;
			focusView.requestFocus();
		}
		

		if ( !error) {
			cancel = true;
		} 
		return cancel;

	}

}
